#pragma once

#include "common.h"
#include <string>
#include <vector>
#include <iostream>

enum ELECTRIC_MOTOR_TYPE {
    THREE_PHASED_ASYNC, // 三相异步电动机
    THREE_PHASED_SYNC,  // 三相同步电动机
    SINGLE_PHASED,      // 单相电动机
    DC_BRUSHED          // 有刷直流电动机
};

class ElectricMotorProperty {
public:
    // 构造函数，用于初始化ElectricMotorProperty对象
    ElectricMotorProperty(const std::string &name,  // 电机名称
                          ELECTRIC_MOTOR_TYPE type, // 电机类型
                          fp_type maxPower,          // 最大功率
                          fp_type maxTorque,         // 最大扭矩
                          fp_type maxRPM,            // 最大转速
                          fp_type efficiency,        // 效率
                          fp_type gearRatio)         // 齿轮比
        : name(name), type(type), maxPower(maxPower), maxTorque(maxTorque),
          maxRPM(maxRPM), efficiency(efficiency), gearRatio(gearRatio) {}

    std::string getName() const { return name; }
    fp_type getMaxPower() const { return maxPower; }
    // void setMaxPower(fp_type maxPower) { maxPower_ = maxPower; }
    fp_type getMaxTorque() const { return maxTorque; }
    // void setMaxTorque(fp_type maxTorque) { maxTorque_ = maxTorque; }
    fp_type getMaxRPM() const { return maxRPM; }
    // void setMaxRPM(fp_type maxRPM) { maxRPM_ = maxRPM; }
    fp_type getEfficiency() const { return efficiency; }
    fp_type getGearRatio() const { return gearRatio; }
    ELECTRIC_MOTOR_TYPE getType() const { return type; }
    // 设置电机类型
    // 获取轮周最大速度(km/h)
    fp_type getMaxPerimeterSpeed(fp_type wheelDiameter) const;
    // 获取最大扭矩限制(kN·m)
    fp_type getTorqueLimitOnAxle(fp_type wheelDiameter) const;

private:
    std::string name;
    ELECTRIC_MOTOR_TYPE type;
    fp_type maxPower;
    fp_type maxTorque;
    fp_type maxRPM;
    fp_type efficiency;
    fp_type gearRatio;
};

class ElectricMotor {
public:
    ElectricMotor(short id, short status) : id(id), status(status) {}

    short getId() const { return id; }
    short getStatus() const { return status; }
    void setStatus(short status) { status = status; }

    // 创建多个电机
    static std::vector<ElectricMotor> createMultipleMotors(short count) {
        std::vector<ElectricMotor> motors;
        for (short i = 0; i < count; i++) {
            // TODO: Modify this!
            ElectricMotor motor1(i, 3);
            motors.push_back(motor1
                ); // 假设每个电机的初始状态为关闭
        }
        return motors;
    };

private:
    short id;
    short status;
};
